package com.atguigu.crowd.mvc.handler;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.atguigu.crowd.constant.CrowdConstant;
import com.atguigu.crowd.entity.Admin;
import com.atguigu.crowd.service.api.AdminService;
import com.atguigu.crowd.util.CrowdUtil;
import com.atguigu.crowd.util.ResultEntity;
import com.github.pagehelper.PageInfo;

@Controller
public class AdminHandler {
	@Autowired
	AdminService adminService;
	
	/**
	 * 测试页面跳转
	 * @return
	 */
	@RequestMapping(value="admin/to/login2.ht")
	public String toLoginPage() {
		return "admin-login";
	}
	/**
	 * 处理管理员登录的方法
	 */
	//@RequestMapping("admin/do/login.ht")
	@PostMapping("admin/do/login.ht")
	public String doLogin(
			@RequestParam("loginAcct") String loginAcct,
			@RequestParam("userPswd") String userPswd,
			HttpSession session
			) {
		//调用service方法去执行登录检查
		//这个方法如果能够返回admin 对象则说明登录成功，如果账号或者密码不正确则会抛出异常
		
		Admin admin =adminService.getAdminByLoginAcct(loginAcct,userPswd);
		
		//将登录返回成功的admin对象存入Session域
		/*session.setAttribute("loginAdmin", admin);*/
		//改成常量管理的方式，实际上和上面的代码一样
		session.setAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN, admin);
		
		//如果是ajax提交的表单，就可以直接用转发
		/*return "admin-main";*/
		
		//由转发改成重定向
		return "redirect:/admin/to/main/page.ht";
	}
	/**
	 * 退出登录
	 */
	@RequestMapping("admin/do/loginout.ht")
	public String loginout(HttpSession session) {
		
		//强制session失效
		session.invalidate();
		//重定向 去 登录页面，其它页面也去不了，因为其它页面都要登录后才能去
		return "redirect:/admin/to/login.ht";
	}
	
	/**
	 * 点击"用户维护"触发的handler,分页展示用户数据
	 * @return
	 */
	@RequestMapping("/admin/get/page.ht")
	public String adminGetPageInfo(
			//使用@RequestParam注解 解决在请求中有些参数有 、有些参数没有的问题
			//keyword表示你输入的查询条件是什么关键字，keyword有值则取它的值，没值则默认为空字符串，和sql语句配合实现两种情况适配(使用)
			@RequestParam(value="keyword",defaultValue="")String keyword,
			//pageNum代表的是这是第几页，pageNum的默认值使用1
			@RequestParam(value="pageNum",defaultValue="1")Integer pageNum,
			//pageSize表示每页显示多少条数据，pageSize的默认值使用5
			@RequestParam(value="pageSize",defaultValue="5")Integer pageSize,
			//不要忘记这个模型参数
			ModelMap modelMap
			
			) {
		//调用service方法获取PageInfo对象
		PageInfo<Admin> pageInfo =adminService.getPageInfo(keyword, pageNum, pageSize);
		
		//将PageInfo 对象存入模型
		//modelMap.addAttribute("pageInfo", pageInfo);
		modelMap.addAttribute(CrowdConstant.ATTR_NAME_PAGE_INFO, pageInfo);
		
		System.out.println(pageInfo);
		
		return "admin-page";

	}
	/**
	 * 删除的handler方法
	 * @param adminId
	 * @param pageNum
	 * @param keyword
	 * @return
	 */
	@RequestMapping("/admin/delete/one/{id}/{pageNum}/{keyword}.ht")
	public String adminDeleteOne(
			@PathVariable("id") Integer adminId,
			@PathVariable("pageNum") Integer pageNum,
			@PathVariable("keyword") String keyword
			){
		
		System.out.println("-----------adminId:"+adminId);
		//调用service方法获取PageInfo对象
		adminService.adminDeleteOne(adminId);
		
		/*尝试方案1：直接转发到admin-page.jsp会无法显示分页数据*/
		/*return "admin-page";*/
		
		//方案2：转发到admin-page的 @RequestMapping地址 即  admin/get/page.ht
		//return "forward:/admin/get/page.ht";
		
		//方案3：重定向，终极武器，重定向能够解决很多问题
		//return "redirect:/admin/get/page.ht"; //不带参数，只是删除后不会保持删除后的状态又回到了第1页
		
		System.out.println("-----------pageNum:"+pageNum);
		System.out.println("-----------keyword:"+keyword);
		return "redirect:/admin/get/page.ht?pageNum="+pageNum+"&keyword="+keyword;
	}
	/**
	 * 新增的handler方法
	 */
	@RequestMapping("admin/add/one.ht")
	public String adminAddOne(
			@RequestParam("loginAcct") String loginAcct,
			@RequestParam("userPswd") String userPswd,
			@RequestParam("userName") String userName,
			@RequestParam("email") String email
			){
		
		System.out.println("测试参数对不对");
		System.out.println("loginAcct="+loginAcct);
		System.out.println("userPswd="+userPswd);
		System.out.println("userName="+userName);
		System.out.println("email="+email);
		
		//1、在保存之前，，密码要先加密
		userPswd=CrowdUtil.md5(userPswd);
		//2、生成创建时间
		Date date=new Date();
		SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss");
		String createTime=format.format(date);
		
		//调用service方法获取PageInfo对象
		Admin admin=new Admin(null, loginAcct, userPswd, userName, email, createTime);
		
		int result = adminService.adminAddOne(admin);
		
		
		if (result>0) {System.out.println("新增成功！！！！！！！！！！！！！！！！！");
		}else {System.out.println("新增失败---------------------");
		}
		
		//新增完成之后就跟删除完之后一样，调回到主页面来
		//return "forward:admin/to/main/page.ht";
		//return "redirect:/admin/to/main/page.ht";
		return "redirect:/admin/get/page.ht?pageNum="+Integer.MAX_VALUE;//新增数据完成后要保证返回的页面是最后一页，这样用户能够直观的看到新增的数据
	}
	/**
	 * 跳转到 查看
	 * @return
	 */
	@RequestMapping("admin/to/view.ht")
	public String adminToView(@Param("id") Integer id,ModelMap modelMap) {
		
		//1、根据Admin的id查询到Admin对象
		Admin admin =adminService.getAdminByPrimaryKey(id);
		//2、将Admin对象存入到ModelMap模型
		modelMap.addAttribute("admin", admin);
		return "admin/admin-view";//这个逻辑处理完之后，跳转到修改页面 admin-edit.jsp 
	}
	/**
	 * 跳转到 修改/编辑 页面去，因为要做回显所以必须要这个方法来做一点事情
	 * @return
	 */
	@RequestMapping("admin/to/edit.ht")
	public String adminToEdit(@Param("id") Integer id,ModelMap modelMap) {
		
		//1、根据Admin的id查询到Admin对象
		Admin admin =adminService.getAdminByPrimaryKey(id);
		//2、将Admin对象存入到ModelMap模型
		modelMap.addAttribute("admin", admin);
		return "admin-edit";//这个逻辑处理完之后，跳转到修改页面 admin-edit.jsp 
	}
	/**
	 * 执行修改
	 * @return
	 */
	@RequestMapping("/admin/do/edit.ht")
	public String adminDoEdit(Admin admin,@RequestParam("pageNum") Integer pageNum,@RequestParam("keyword") String keyword) {
		adminService.updateByExampleSelective(admin);
		System.out.println("------pageNum:"+pageNum);
		System.out.println("------keyword:"+keyword);
		
		System.out.println("————————————————————————测试——————————————————————————————————");
		
		//return "admin/get/page.ht?pageNum="+pageNum+"&keyword="+keyword;
		return "redirect:/admin/get/page.ht?pageNum="+pageNum+"&keyword="+keyword;
	}

	//异步专用---删除多条或者1条数据---------------------------------------------------------------
	@ResponseBody
	@RequestMapping("admin/delete/array.ht")
	public ResultEntity<Admin> adminDeleteArray(@RequestBody List<Integer> roleIds){
		
		
		int result = adminService.adminDeleteArray(roleIds);
		
		if (result>0) {
			
			return ResultEntity.successWithoutData();
			
		}else {
			
			return ResultEntity.failed("更新的数据为0");
		}
		
	}
}


















